/*
Copyright [2012] [Maria Eugenia Malagamba]
Copyright [2012] [Leandro Pellegrino]
Copyright [2012] [Julia Gambuzzi]
Copyright [2012] [Ignacio Capodanno]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

#include "Hidratador.h"
#include <fstream>

Hidratador::Hidratador(string pathXML, string carpetaCliente){

	this->pathCarpetaCliente = carpetaCliente;
	this->parserXML = new ParserXML(this->pathCarpetaCliente);
	this->parserXML->parsearDocumento(pathXML + ".xml");
	
}

int Hidratador::getAltoTablero(){

	string alto = (string)this->parserXML->getDocumento()->FirstChildElement("asteroids")->Attribute("alto");
	return atoi(alto.c_str());
}

int Hidratador::getAnchoTablero(){

	string ancho = (string)this->parserXML->getDocumento()->FirstChildElement("asteroids")->Attribute("ancho");
	return atoi(ancho.c_str());
}

string Hidratador::getNombreFondo(){

	string nombreFondo = (string)this->parserXML->getDocumento()->FirstChildElement("asteroids")->Attribute("fondo");
	return nombreFondo;
}

Nave* Hidratador::hidratarNave(int numeroDeNave){

	TiXmlDocument * navesXML = new TiXmlDocument();
	navesXML->LoadFile("naves.xml", TIXML_ENCODING_UTF8);
	TiXmlElement * nodoNave = navesXML->FirstChildElement("naves")->FirstChildElement("nave");
	
	for (unsigned int i = 1; i < numeroDeNave; i++){
		nodoNave = nodoNave->NextSiblingElement();
	}
	
	string pathDeLaImagen = (string)nodoNave->Attribute("imagen");

	string velocidadDeRotacion = (string)nodoNave->Attribute("velRotacion");
	string velocidadMaxima = (string)nodoNave->Attribute("velMaxima");
	string propulsion = (string)nodoNave->Attribute("propulsion");
	string friccion = (string)nodoNave->Attribute("friccion");
	string duracionBala = (string)nodoNave->Attribute("duracionBala");
	string velocidadBala = (string)nodoNave->Attribute("velocidadBala");
	string ciclosParaReparar = (string)nodoNave->Attribute("ciclosParaReparar");

	Nave* naveHidratada = new Nave(pathDeLaImagen,(double)atoi(velocidadDeRotacion.c_str()),atoi( velocidadMaxima.c_str()),
		atoi(propulsion.c_str()), atoi(friccion.c_str()), atoi(duracionBala.c_str()), atoi(velocidadBala.c_str()), 
		atoi(ciclosParaReparar.c_str()));
	
	delete navesXML;
	
	return naveHidratada;
}

Nave* Hidratador::hidratarNave(){

	TiXmlElement* nodoNave = this->parserXML->getDocumento()->FirstChildElement("asteroids")->FirstChildElement("nave");

	string pathDeLaImagen = (string)nodoNave->Attribute("imagen");
	string velocidadDeRotacion = (string)nodoNave->Attribute("velRotacion");
	string velocidadMaxima = (string)nodoNave->Attribute("velMaxima");
	string propulsion = (string)nodoNave->Attribute("propulsion");
	string friccion = (string)nodoNave->Attribute("friccion");
	string duracionBala = (string)nodoNave->Attribute("duracionBala");
	string velocidadBala = (string)nodoNave->Attribute("velocidadBala");
	string ciclosParaReparar = (string)nodoNave->Attribute("ciclosParaReparar");

	Nave* naveHidratada = new Nave(pathDeLaImagen,(double)atoi(velocidadDeRotacion.c_str()),atoi( velocidadMaxima.c_str()),
		atoi(propulsion.c_str()), atoi(friccion.c_str()), atoi(duracionBala.c_str()), atoi(velocidadBala.c_str()), 
		atoi(ciclosParaReparar.c_str()));
	return naveHidratada;
}

//Recorro todos los tags Asteroide y creo las entidades hidratadas.
vector<Asteroide*>* Hidratador::hidratarAsteroides(){

	vector<Asteroide*>* listaAsteroides = new vector<Asteroide*>();
	vector<TipoDeAsteroide>*  listaTiposDeAsteroides = this->hidratarTiposDeAsteroide();

	TiXmlElement* nodoAsteroide = this->parserXML->getDocumento()->FirstChildElement("asteroids")->FirstChildElement("asteroides")->FirstChildElement("asteroide");

	while (nodoAsteroide != 0){
		string tipoDeAsteroide = nodoAsteroide->Attribute("tipo");
		//si el tipo = "|", el asteroide está fuera de la pantalla, no lo cargo

		if(tipoDeAsteroide != "|"){
			string x = (string)nodoAsteroide->Attribute("x");
			string y = (string)nodoAsteroide->Attribute("y");
			string dir = (string)nodoAsteroide->Attribute("direccion");
			string vel = (string)nodoAsteroide->Attribute("velocidad");
			int velocidad = atoi(vel.c_str());
			int direccion = atoi(dir.c_str());
			int posX = atoi(x.c_str());
			int posY = atoi(y.c_str());

			//Busco el tipo de asteroided en la lista de tipos ya cargada.
			int posicionDelTipoAsteroide = getPosicionTipoDeAsteroide(listaTiposDeAsteroides, tipoDeAsteroide);

			if (posicionDelTipoAsteroide != -1){
				Asteroide* asteroideAHidratar = new Asteroide(direccion, velocidad, tipoDeAsteroide,posX,posY,
					listaTiposDeAsteroides->at(posicionDelTipoAsteroide).pathDeLaImagen,
					listaTiposDeAsteroides->at(posicionDelTipoAsteroide).anchoDeLaImagen,
					listaTiposDeAsteroides->at(posicionDelTipoAsteroide).altoDeLaImagen,(double)listaTiposDeAsteroides->at(posicionDelTipoAsteroide).rotacionDeLaImagen);


				listaAsteroides->push_back(asteroideAHidratar);
			}

		}
		nodoAsteroide = nodoAsteroide->NextSiblingElement();
	}

	return listaAsteroides;
}

vector<TipoDeAsteroide>* Hidratador::hidratarTiposDeAsteroide(){

	vector<TipoDeAsteroide>* listaTiposDeAsteroides = new vector<TipoDeAsteroide>();

	TiXmlElement* nodoTipoDeAsteroide = this->parserXML->getDocumento()->FirstChildElement("asteroids")->FirstChildElement("tiposAsteroide")->FirstChildElement("tipoAsteroide");

	while (nodoTipoDeAsteroide != 0){

		if((string)nodoTipoDeAsteroide->Attribute("nombre") != "|"){

			TipoDeAsteroide tipoDeAsteroideAHidratar;
			tipoDeAsteroideAHidratar.nombre = (string)nodoTipoDeAsteroide->Attribute("nombre");
			string nombreTipoAsteroide = (string)nodoTipoDeAsteroide->Attribute("imagen");
			tipoDeAsteroideAHidratar.pathDeLaImagen = this->pathCarpetaCliente + nombreTipoAsteroide;
			string alto = (string)nodoTipoDeAsteroide->Attribute("alto");
			string ancho = (string)nodoTipoDeAsteroide->Attribute("ancho");
			string rotacion = (string)nodoTipoDeAsteroide->Attribute("rotacion");
			tipoDeAsteroideAHidratar.altoDeLaImagen = atoi(alto.c_str());
			tipoDeAsteroideAHidratar.anchoDeLaImagen = atoi(ancho.c_str());
			tipoDeAsteroideAHidratar.rotacionDeLaImagen = atoi(rotacion.c_str());
		
			// TODO: ver el quien mata al vector
			listaTiposDeAsteroides->push_back(tipoDeAsteroideAHidratar);
		}
			nodoTipoDeAsteroide = nodoTipoDeAsteroide->NextSiblingElement();
		
	}

	return listaTiposDeAsteroides;


}
int Hidratador::getPosicionTipoDeAsteroide(vector<TipoDeAsteroide>* vector, string tipoDeAsteroide){

	for (unsigned int i = 0; i < vector->size(); i++){
		if (vector->at(i).nombre == tipoDeAsteroide) return i;
	}
	//no encontre el tipo de asteroide en el vector porque no estaba en el XML.
	return -1;
}
vector<string>* Hidratador::getNombreImagenes(){

	vector<string>* nombres = new vector<string>;
	vector<TipoDeAsteroide>*  listaTiposDeAsteroides = this->hidratarTiposDeAsteroide();
	for (unsigned int i = 0; i < listaTiposDeAsteroides->size(); i++){
		nombres->push_back(listaTiposDeAsteroides->at(i).pathDeLaImagen);
	}

	delete listaTiposDeAsteroides;

	return nombres;
}


Hidratador::~Hidratador(){
	delete this->parserXML;
}
